package handlers

import (
	"jianianhua-server/database"
	"jianianhua-server/models"
	"jianianhua-server/utils"

	"github.com/gin-gonic/gin"
)

type UserHandler struct{}

func NewUserHandler() *UserHandler {
	return &UserHandler{}
}

// GetUsers 获取用户列表
func (h *UserHandler) GetUsers(c *gin.Context) {
	userID, exists := utils.GetUserIDFromContext(c)
	if !exists {
		utils.UnauthorizedResponse(c, "用户未登录")
		return
	}

	// 检查是否为管理员
	var user models.User
	err := database.DB.Where("id = ?", userID).First(&user).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户信息失败")
		return
	}

	if user.Role != "admin" {
		utils.ForbiddenResponse(c, "权限不足，只有管理员才能查看用户列表")
		return
	}

	// 获取查询参数
	search := c.Query("search")

	// 构建查询
	query := database.DB.Model(&models.User{})

	// 搜索条件
	if search != "" {
		searchPattern := "%" + search + "%"
		query = query.Where("nickname LIKE ? OR phone LIKE ?", searchPattern, searchPattern)
	}

	// 获取总数
	var total int64
	query.Count(&total)

	// 获取用户列表（返回所有数据，不分页）
	var users []models.User
	err = query.Order("created_at DESC").Find(&users).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户列表失败: "+err.Error())
		return
	}

	utils.SuccessResponse(c, gin.H{
		"list":      users,
		"total":     total,
		"page":      1,
		"page_size": len(users),
	})
}

// GetUser 获取单个用户信息
func (h *UserHandler) GetUser(c *gin.Context) {
	userID, exists := utils.GetUserIDFromContext(c)
	if !exists {
		utils.UnauthorizedResponse(c, "用户未登录")
		return
	}

	// 检查是否为管理员
	var currentUser models.User
	err := database.DB.Where("id = ?", userID).First(&currentUser).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户信息失败")
		return
	}

	if currentUser.Role != "admin" {
		utils.ForbiddenResponse(c, "权限不足，只有管理员才能查看用户信息")
		return
	}

	// 获取目标用户ID
	targetUserID := c.Param("id")
	if targetUserID == "" {
		utils.BadRequestResponse(c, "用户ID不能为空")
		return
	}

	// 查询目标用户
	var targetUser models.User
	err = database.DB.Where("id = ?", targetUserID).First(&targetUser).Error
	if err != nil {
		utils.NotFoundResponse(c, "用户不存在")
		return
	}

	utils.SuccessResponse(c, targetUser)
}

// UpdateUserBlacklist 更新用户拉黑状态
func (h *UserHandler) UpdateUserBlacklist(c *gin.Context) {
	userID, exists := utils.GetUserIDFromContext(c)
	if !exists {
		utils.UnauthorizedResponse(c, "用户未登录")
		return
	}

	// 检查是否为管理员
	var currentUser models.User
	err := database.DB.Where("id = ?", userID).First(&currentUser).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户信息失败")
		return
	}

	if currentUser.Role != "admin" {
		utils.ForbiddenResponse(c, "权限不足，只有管理员才能管理用户拉黑状态")
		return
	}

	// 获取目标用户ID
	targetUserID := c.Param("id")
	if targetUserID == "" {
		utils.BadRequestResponse(c, "用户ID不能为空")
		return
	}

	// 解析请求参数
	var req struct {
		IsBlacklisted bool `json:"is_blacklisted"`
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		utils.BadRequestResponse(c, "参数错误: "+err.Error())
		return
	}

	// 查询目标用户
	var targetUser models.User
	err = database.DB.Where("id = ?", targetUserID).First(&targetUser).Error
	if err != nil {
		utils.NotFoundResponse(c, "用户不存在")
		return
	}

	// 不能拉黑管理员
	if targetUser.Role == "admin" {
		utils.BadRequestResponse(c, "不能拉黑管理员账户")
		return
	}

	// 更新拉黑状态
	targetUser.IsBlacklisted = req.IsBlacklisted
	err = database.DB.Save(&targetUser).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "更新用户拉黑状态失败: "+err.Error())
		return
	}

	utils.SuccessResponse(c, gin.H{
		"message": "操作成功",
		"user":    targetUser,
	})
}

// CheckUserBlacklist 检查用户是否被拉黑
func (h *UserHandler) CheckUserBlacklist(c *gin.Context) {
	userID, exists := utils.GetUserIDFromContext(c)
	if !exists {
		utils.UnauthorizedResponse(c, "用户未登录")
		return
	}

	// 查询用户拉黑状态
	var user models.User
	err := database.DB.Where("id = ?", userID).First(&user).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户信息失败")
		return
	}

	utils.SuccessResponse(c, gin.H{
		"is_blacklisted": user.IsBlacklisted,
		"user_id":        user.ID,
	})
}

// ToggleStaffStatus 切换用户美甲师状态
func (h *UserHandler) ToggleStaffStatus(c *gin.Context) {
	userID, exists := utils.GetUserIDFromContext(c)
	if !exists {
		utils.UnauthorizedResponse(c, "用户未登录")
		return
	}

	// 检查是否为管理员
	var currentUser models.User
	err := database.DB.Where("id = ?", userID).First(&currentUser).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户信息失败")
		return
	}

	if currentUser.Role != "admin" {
		utils.ForbiddenResponse(c, "权限不足，只有管理员才能执行此操作")
		return
	}

	// 获取目标用户ID
	targetUserID := c.Param("id")
	if targetUserID == "" {
		utils.BadRequestResponse(c, "用户ID不能为空")
		return
	}

	// 查询目标用户
	var targetUser models.User
	err = database.DB.Where("id = ?", targetUserID).First(&targetUser).Error
	if err != nil {
		utils.NotFoundResponse(c, "用户不存在")
		return
	}

	// 切换美甲师状态
	targetUser.IsStaff = !targetUser.IsStaff
	err = database.DB.Save(&targetUser).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "更新美甲师状态失败")
		return
	}

	utils.SuccessResponse(c, gin.H{
		"message":  "美甲师状态更新成功",
		"user_id":  targetUser.ID,
		"is_staff": targetUser.IsStaff,
	})
}

// GetStaffList 获取美甲师列表
func (h *UserHandler) GetStaffList(c *gin.Context) {
	userID, exists := utils.GetUserIDFromContext(c)
	if !exists {
		utils.UnauthorizedResponse(c, "用户未登录")
		return
	}

	// 检查是否为管理员
	var currentUser models.User
	err := database.DB.Where("id = ?", userID).First(&currentUser).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取用户信息失败")
		return
	}

	if currentUser.Role != "admin" {
		utils.ForbiddenResponse(c, "权限不足，只有管理员才能查看美甲师列表")
		return
	}

	// 查询所有美甲师
	var staffList []models.User
	err = database.DB.Where("is_staff = ?", true).Find(&staffList).Error
	if err != nil {
		utils.InternalServerErrorResponse(c, "获取美甲师列表失败: "+err.Error())
		return
	}

	utils.SuccessResponse(c, gin.H{
		"list":  staffList,
		"total": len(staffList),
	})
}
